package com.zzyl.common.utils;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalTime;

/**
 * 时间范围判断工具类
 */
@Slf4j
public class TimeRangeUtils {

    /**
     * 判断当前时间是否在指定时间范围内
     * 
     * @param timeRange 时间范围字符串，格式如 "10:00:00-12:00:00"，"-1"表示全天
     * @return true-在时间范围内，false-不在时间范围内
     */
    public static boolean isCurrentTimeInRange(String timeRange) {
        return isTimeInRange(timeRange, LocalTime.now());
    }

    /**
     * 判断指定时间是否在时间范围内
     * 
     * @param timeRange 时间范围字符串，格式如 "10:00:00-12:00:00"，"-1"表示全天
     * @param targetTime 目标时间
     * @return true-在时间范围内，false-不在时间范围内
     */
    public static boolean isTimeInRange(String timeRange, LocalTime targetTime) {
        // 如果未设置时间范围，则默认在范围内
        if (StrUtil.isEmpty(timeRange) || "-1".equals(timeRange)) {
            return true;
        }

        try {
            // 解析时间范围字符串
            String[] times = timeRange.split("-");
            if (times.length != 2) {
                return true; // 格式不正确，默认在范围内
            }

            // 解析开始时间和结束时间
            LocalTime startTime = LocalTime.parse(times[0]);
            LocalTime endTime = LocalTime.parse(times[1]);

            // 判断是否在时间范围内
            return isTimeInRange(startTime, endTime, targetTime);
        } catch (Exception e) {
            log.warn("解析时间范围异常，使用默认值: {}", timeRange, e);
            return true; // 解析异常时，默认在范围内
        }
    }

    /**
     * 判断指定时间是否在开始时间和结束时间之间
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param targetTime 目标时间
     * @return true-在时间范围内，false-不在时间范围内
     */
    public static boolean isTimeInRange(LocalTime startTime, LocalTime endTime, LocalTime targetTime) {
        // 考虑跨天情况，如 22:00:00-06:00:00
        if (startTime.isAfter(endTime)) {
            // 跨天情况：目标时间大于等于开始时间 或者 小于等于结束时间
            return targetTime.isAfter(startTime) || targetTime.isBefore(endTime) || targetTime.equals(startTime);
        } else {
            // 不跨天情况：目标时间在开始时间和结束时间之间
            return (targetTime.isAfter(startTime) || targetTime.equals(startTime)) 
                && (targetTime.isBefore(endTime) || targetTime.equals(endTime));
        }
    }
}
